{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. 简述混合高斯模型的基本原理，以及通过混合高斯模型进行背景建模的基本思想。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 高斯模型：固定画面中，同一位置的像素灰度值随时间变化符合高斯分布。\n",
    "#### 混合高斯模型的基本原理：在相机静止，目标运劢的情况下，同一位置的像素灰度值随时间变化可能不再符合传统的简单的高斯分布，这个时候我们可以用多个高斯分布的组合去模拟这种新的分布(任何一种分布函数都可以看做是多个高斯分布的组合)。混合高斯模型本质上是基于像素样本统计信息的背景表示方法，利用像素在较长时间内大量样本值的概率密度等统计信息(如模式数量、每个模式的均值和标准差)表示背景，然后使用统计差分(如3σ原则)进行目标/背景像素判断。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 混合高斯模型的基本思想:\n",
    "#### 1. 首先我们建立像素灰度(随时间)的概率密度函数：\n",
    "$$ p(I) = \\sum_{q=1}^{Q}w_qN(I;\\mu_q,\\sigma^2_q) $$\n",
    "$$ 其中 w_q 是权值； N(I;\\mu_q,\\sigma^2_q) = \\cfrac{1}{\\sqrt[2]{2\\pi}\\sigma_q}e^{\\cfrac{(1-\\mu_q)^2}{2\\sigma^2_q}} 是高斯函数 $$\n",
    "#### 我们可以将上面的概率密度函数表达为条件概率函数:\n",
    "$$ p(x) = \\sum_{q=1}^{Q}p(x|w_q)P(w_q) $$\n",
    "$$ 其中P(w_q)对应权值；$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 接下来就需要求解下面三个参数值:\n",
    "$$ w_q,\\mu_q,\\sigma_q $$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2.混合高斯模型的建模步骤:\n",
    "#####  2.1 模型初始化  将采到的第一帧图像的每个象素的灰度值作为 均值，再赋以较大的方差(如:𝜎 = 20)。初值: q=1,w=1.0\n",
    "#####  2.2 模型学习  将当前帧的对应点象素的灰度值与已有的 q 个高 斯模型作比较，若满足:\n",
    "$$ |x_k-\\mu_{q,k}| < 2.5\\sigma_{q,k} $$\n",
    "#####  则按上页斱式调 整第q个高斯模型的参数和权重；否则转入(3)： \n",
    "#####  2.3 增加/替换高斯分量  若不满足条件，且 q < Q ，则增加一个 新分量；若q=Q，则替换。(Q为最多可以存在的高斯模型，一般选3-5个)\n",
    "#####  2.4 利用下面公式判断背景：\n",
    "$$ B = \\underset{b}{argmin}(\\sum_{q=1}^bw_q>T) $$\n",
    "#####  2.5 不符合上面公式的判断为前景：(例子：如果:Q=5，w = (0.4, 0.3, 0.18, 0.06, 0.06)(从大到小排列), T=0.6; 则我们认为0.4和0.3权值的高斯分布是背景(0.4+0.3>0.6)，后面三个是高斯分布是前景 )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2.混合高斯模型的迭代计算原理 :\n",
    "$$ w_q(k+1) = (1-\\alpha)w_q(k) + \\alpha M_q(k+1) $$\n",
    "$$ \\mu(k+1) = (1-\\rho)\\mu_q(k) + \\rho I(k+1) $$\n",
    "$$ \\sigma_q^2(k+1) = (1-\\rho)\\sigma_q^2(k) + \\rho(I(k+1) - \\mu_q(k+1))^2$$\n",
    "$$ \\rho = \\alpha G(I(k+1);\\mu_q,\\sigma_q)$$\n",
    "#### 其中 M_q(k) 为二值化函数，仅当像素匹配第q类时取1，其余取0。𝛼 为学习能力，𝛼 越大学习新的能力越强，对旧的遗忘的越快。一般𝛼取值0.005-0.5"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. 解释光流计算中的恒定亮度假设，进一步简述L-K光流估计方法的基本原理。 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2.1 光流法的三个前提假设：\n",
    "#### (1）相邻帧之间的亮度恒定；\n",
    "#### (2）相邻视频帧的取帧时间连续，或者，相邻帧之间物体的运动比较“微小”；\n",
    "#### (3）保持空间一致性；即，同一子图像的像素点具有相同的运动\n",
    "#### 其实也比较好理解，恒定亮度假设：现实生活中，相邻帧之间时间间隔很短，可以视为图片的灰度在很短的间隔时间内保持不变。\n",
    "#### 同时也可以根据光流估计模型方程也诠释了上述前两个假设:在每一个像素(x,y)处，有：\n",
    "$$  I(x+\\Delta x, y = \\Delta y, t + 1) = I(x,y,t) + \\cfrac{\\partial I}{\\partial x}\\Delta x + \\cfrac{\\partial I}{\\partial y}\\Delta y +\\cfrac{\\partial I}{\\partial t} $$\n",
    "#### 从上面的表达式看出了，分别对x,y,t求偏导，为了能使用泰勒展开式 Δx和 Δy应该是充分小，并且三个偏导项是存在的。也就是说当前图像在X方向,Y方向和T轴上面是连续光滑的，也就意味着图像本身没有剧烈的变化，在相邻两帧中的变化不会太大，在实际生活中也能基本满足。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2.2 L-K光流估计方法的基本原理："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 由光流估计模型方程：\n",
    "$$  I(x+\\Delta x, y = \\Delta y, t + 1) = I(x,y,t) + \\cfrac{\\partial I}{\\partial x}\\Delta x + \\cfrac{\\partial I}{\\partial y}\\Delta y +\\cfrac{\\partial I}{\\partial t} $$\n",
    "#### 因此有:\n",
    "$$ I(x,y,t) + \\cfrac{\\partial I}{\\partial x}\\Delta x + \\cfrac{\\partial I}{\\partial y}\\Delta y +\\cfrac{\\partial I}{\\partial t} = I(x,y,t) $$\n",
    "$$ \\cfrac{\\partial I}{\\partial x}\\Delta x + \\cfrac{\\partial I}{\\partial y}\\Delta y +\\cfrac{\\partial I}{\\partial t} = 0 $$\n",
    "$$ I_x\\Delta x + I_y\\Delta y = -I_t $$\n",
    "#### （可以将运动的变化看成是亮度(灰度值)对时间的导数。）下面的任务是求解 (u,v) = (Δx,Δy)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 再由假设3同一领域的像素点具有相同的运动，所以可以得到:\n",
    "$$ \\left[ \\begin{array} {cccc} I_{x_1}&I_{y_1}\\\\ I_{x_2}&I_{y_2} \\\\ \\ldots \\\\ I_{x_n}&I_{y_n} \\end{array} \\right] \\left[ \\begin{array} {cccc} u\\\\ v \\end{array} \\right] = - \\left[ \\begin{array} {cccc} I_{t_1}\\\\ I_{t_2} \\\\ \\ldots \\\\ I_{t_n} \\end{array} \\right] $$\n",
    "#### 即 \n",
    "$$ Au = b $$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 所以可以转换成最优化问题(超定方程求解)\n",
    "$$ min ||Au - b|| $$\n",
    "#### 最小二乘解：\n",
    "$$ u = (A^TA)^{-1}A^Tb $$\n",
    "#### 所以当领域像素为2个时，就是2元一次方程组求解。 多个像素，比如 3*3时，则是求解上述最小二乘解。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 对于L-K光流估计，思路与之前的一致，只是多了一个权重取值，对应模型方程为：\n",
    "$$ E(Δx,Δy) = \\sum_iw_i^2(I_{x_i}Δx + I_{y_i}Δy + I_{t_i})^2 $$\n",
    "#### 需要求解：\n",
    "$$ min E(Δx,Δy) $$\n",
    "#### 对应方程如下:\n",
    "$$ \\left[ \\begin{array} {cccc} w_1&0&\\ldots&0 \\\\ 0&w_2&\\ldots&0 \\\\ \\ldots \\\\ 0&0&\\ldots&w_n \\end{array} \\right]  \\left[ \\begin{array} {cccc} I_{x_1}&I_{y_1}\\\\ I_{x_2}&I_{y_2} \\\\ \\ldots \\\\ I_{x_n}&I_{y_n} \\end{array} \\right] \\left[ \\begin{array} {cccc} u\\\\ v \\end{array} \\right] = \\left[ \\begin{array} {cccc} w_1&0&\\ldots&0 \\\\ 0&w_2&\\ldots&0 \\\\ \\ldots \\\\ 0&0&\\ldots&w_n \\end{array} \\right] \\left[ \\begin{array} {cccc} I_{t_1}\\\\ I_{t_2} \\\\ \\ldots \\\\ I_{t_n} \\end{array} \\right] $$\n",
    "#### 即:\n",
    "$$ WAu = Wb $$\n",
    "#### 最后可以求解得到 \n",
    "$$ u = (A^TW^2A)^{-1}A^TW^2b $$\n",
    "#### 在计算逆矩阵时，需要确定矩阵有逆，跟Harris算子一样，在角点处，矩阵特征值较大，我们才能计算得到比较好的光流结果。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### L-K光流估计难以处理大位移，后续优化使用金字塔L-K方法。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
